%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% PREAMBULO
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% Tipo de documento
\documentclass[11pt,a4paper]{report}
% Codificacion de caracteres
\usepackage[utf8]{inputenx}
% Para tildes y otros signos del castellano
% \usepackage[spanish]{babel}

% Separacion entre parrafos
\setlength{\parskip}{6pt}
% Margenes de hoja
\usepackage{anysize}
\marginsize{3cm}{3cm}{2cm}{2cm}
% Encabezado de pagina
\usepackage{fancyhdr}
% Estilo de pagina
\pagestyle{fancy}\fancyhf{}
% Numeracion de pagina
\fancyfoot[RO,LE]{\thepage}

% Para insertar figuras en un punto exacto
\usepackage{float}
% Para tachar formulas
\usepackage{cancel}

% Para vincular los índices y referencias
\usepackage[colorlinks=false]{hyperref}
% Incrustado de imagenes                 
\usepackage[pdftex]{graphicx}
\DeclareGraphicsExtensions{.pdf,.png,.jpg}
\graphicspath{{img/}}
% Para usar colores                                            
\usepackage{color}
% Para insertar codigo fuente
\usepackage{listings}
% Para resaltar el codigo fuente
\usepackage{times}
% Para enumeracion automatica de teoremas, definiciones, etc
\usepackage[framed]{ntheorem}
\usepackage{framed}
% Para letras dobles (conjuntos matematicos)
\usepackage{amsfonts}
% Para hacer diagramas conmutativos completos
\usepackage{pb-diagram}
% Para símbolos matemáticos
\usepackage{amsmath,amssymb,latexsym}
% Para el símbolo de euro
\usepackage{eurosym}

% Configuración del entorno theorem
\theorembodyfont{\upshape}
%\newframedtheorem{definicion}{{Definición}}[chapter]
%\newframedtheorem{teorema}{{Teorema}}[chapter]
%\newframedtheorem{proposicion}{{Proposición}}[chapter]
%\newtheorem{ejemplo}{{Ejemplo}}[chapter]
%\newtheorem{ejercicio}{{Ejercicio}}[chapter]
\setlength{\theorempreskipamount}{0mm}
\setlength{\theorempostskipamount}{0mm}

% Configuración del entorno listings
\definecolor{gray45}{gray}{.45}
\definecolor{gray70}{gray}{.70}
\definecolor{gray95}{gray}{.95}
\lstset{tabsize=4,
        showspaces=false,
        showtabs=false,
        frame=Ltb,
        framerule=0pt,
        aboveskip=0.5cm,
        framextopmargin=3pt,
        framexbottommargin=3pt,
        framexleftmargin=.4cm,
        framesep=.4pt,
        rulesep=.4pt,
        rulesepcolor=\color{gray70},
        stringstyle=\ttfamily,
        showstringspaces = false,
        basicstyle=\small\ttfamily,
        commentstyle=\color{gray45},
        keywordstyle=\bfseries,
        numbers=left,
        numbersep=15pt,
        numberstyle=\tiny,
        numberfirstline = true,
        breaklines=true,
        stepnumber=1
        }
% En cada inserción de listings:
\lstset{firstnumber=1,
        backgroundcolor=\color{white},
        xleftmargin=0.75cm}          

% Renombramientos:
%\renewcommand\chaptername{Capítulo}
\renewcommand\contentsname{Índice general}
\renewcommand\figurename{Figura}
\renewcommand\lstlistingname{Fragmento de código}



%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% PORTADA
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\author{Grupo 4: \\ Jorge Merino García \\ $<$Jorge.Merino1@alu.uclm.es$>$ \\ Jesús Núñez Arias \\ $<$Jesus.Nunez@alu.uclm.es$>$}
\title{\hrulefill \\ Escuela Superior de Informática \\ Universidad de Castilla-La Mancha \\ \includegraphics[width=3.5cm]{escudoInfBW} \\ Procesadores de Lenguajes \\ Práctica: Memoria}
\date{-\today- \\ \hrulefill}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% DOCUMENTO
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{document}

\maketitle

\thispagestyle{empty}\tableofcontents\pagestyle{fancy}
\newpage


\chapter{Problema y Lenguaje}

\section{Problema}
El problema a resolver consiste en construir diagramas de Conway a partir de un EBNF o una GLC. Realizando el primer entregable nos dimos cuenta de que no exisitía ninguna herramienta que facilitase esta tarea, teniendo que dibujar los diagramas a mano con una aplicación de diseño gráfico de propósito general. Asique decidimos diseñar Conway Diagrams Creator o ConDiaC. ConDiaC tomará un EBNF o GLC como entrada y generará un diagrama de Conway para cada una de las producciones escogidas.
Además se incluye la capacidad de transformar de GLC a EBNF y viceversa, para ampliar las posibilidades del lenguaje.\newline
El lenguaje que se utilizará para la elaboración del procesador de lenguajes será JAVA, ayudandose además de herramientas como JFlex y CUP.

\section{Diagrama en forma de T}
\begin{figure}[H]
\begin{center}
\includegraphics[width=\textwidth]{DiagramaT}
\caption{Diagrama en forma de T}
\end{center}
\end{figure}
\newpage

\section{Sintaxis del Lenguaje}
\subsection{EBNF}

\lstinputlisting[title=EBNF]{EBNF}
\newpage

\subsection{Diagramas de Conway}

A continuación se los diagramas de Conway correspondientes a algunas de las producciones.

\subsubsection{DEFINITION\_LIST}
\begin{figure}[H]
\begin{center}
\includegraphics[width=\textwidth]{DEFINITION_LIST}
\caption{DEFINITION\_LIST}
\end{center}
\end{figure}


\subsubsection{META\_IDENTIFIERS}
\begin{figure}[H]
\begin{center}
\includegraphics[width=\textwidth]{META_IDENTIFIERS}
\caption{META\_IDENTIFIERS}
\end{center}
\end{figure}


\subsubsection{TERM}
\begin{figure}[H]
\begin{center}
\includegraphics[width=\textwidth]{TERM}
\caption{TERM}
\end{center}
\end{figure}

\subsubsection{TERMINAL}
\begin{figure}[H]
\begin{center}
\includegraphics[width=\textwidth]{TERMINAL}
\caption{TERMINAL}
\end{center}
\end{figure}

\section{Semántica del Lenguaje}
\begin{itemize}
	\item \textbf{SINTAX:} La sintaxis del lenguaje está definida por reglas, con las que construiremos el lenguaje.
	\item \textbf{SINTAX\_RULE:} Cada regla sintáctica es una definición de una producción. La parte izquierda es un no terminal y la derecha la 
		definición del mismo.
	\item \textbf{META\_IDENTIFIER:} Un meta-identificador se utiliza para darle nombre a los no terminales y a los tokens. Debe empezar por 
		letra.
	\item \textbf{DEFINITION\_LIST, SINGLE\_DEFINITION \& TERM:} La lista de definiciones contiene una lista de terminos para construir una 
		producción. Estos términos pueden contener repeticiones, ser opcionales, ser otros no terminales o simplemente ser terminales del 
		lenguaje.
	\item \textbf{OPTIONAL\_SEQUENCE, REPEATED\_SEQUENCE \& GROUPED\_SEQUENCE:} Las secuencias contienen nuevas listas de definiciones y sirven 
		para hacer que se repitan dichas definiciones, que sean opcionales o que simplemente estén agrupadas.
	\item \textbf{TERMINAL:} Un terminal es una cadena válida del lenguaje construidos mediante símbolos aceptados por el mismo.
	\item \textbf{DIGIT, LETTER, OTHER\_CHARACTER:} Son símbolos válidos del lenguaje que se utilizarán para construir terminales o meta-
		identificadores. El nombre los define por si solo, son los símbolos que todos conocemos para dígitos, letras y otros símbolos como los de 
		puntuación, los aritméticos, etc\ldots
	\item \textbf{COMMENT \& COMMENT\_SYMBOL:} Definen la forma en la que el usuario debe definir un comentario.
\end{itemize}

\chapter{Analizador Léxico}
\section{Tabla de Tokens}
\begin{center}
	\begin{tabular}{|c|c|c|c|}
		\hline
		\textbf{Token} & \textbf{Lexema} & \textbf{Patrón} & \textbf{Atributos}		\\
		\hline
		ebnf				& ebnf									& ebnf												&		\\ \hline
		brace\_o			& \{										& '\{'												& 		\\ \hline
		brace\_c			& \}										& '\}'												& 		\\ \hline
		eq					& =										& '='													& 		\\ \hline
		id					& a3,inda3143							& [a-zA-Z]+([a-zA-Z0-9])*						& a3,inda3143	\\ \hline
		pipe				& \textbar								& '\textbar'										& 		\\ \hline
		bracket\_o		& [										& '['													& 		\\ \hline
		bracket\_c		& ]										& ']'													& 		\\ \hline
		paren\_o			& (										& '('													& 		\\ \hline
		paren\_c			& )										& ')'													& 		\\ \hline
		string			& "sad.asdf" , '|.3a;'				& (' \textbar ")([a-zA-Z0-9] \textbar \_ \textbar \% \textbar . \textbar ; \textbar : \textbar + \textbar ...)*(' \textbar ")		& 	"sad.asdf" , '|.3:a;'	\\ \hline
		global			& global									& global												& 		\\ \hline
		type				& terminal, nonterminal				& terminal \textbar nonterminal				& 		\\ \hline
		comma				& ,										& ','													&		\\ \hline
		statement\_end	& ;										& ';'													&		\\ \hline
		assignment		& :=										& :=													&		\\ \hline
		grammar			& grammar								& grammar											&		\\ \hline
		operations		& operations							& operations										&		\\ \hline
		ebfn2conway		& ebfn2conway							& ebfn2conway										&		\\	\hline
		glc2conway		& glc2conway							& glc2conway										&		\\	\hline
		ebnf2glc			& ebnf2glc								& ebnf2glc											&		\\	\hline
		glc2ebnf			& glc2ebnf								& glc2ebnf											&		\\	\hline
		all				& all										& all													&		\\	\hline
		end				& end										& end													&		\\
		\hline
	\end{tabular}
\end{center}

\footnote{En el estado donde se reconoce el token id, se reconocerán todas las palabras reservadas (global, type, operations, ebnf2conway,\ldots)}

\newpage


\begin{figure}[H]
\begin{center}
\includegraphics[height=\textheight]{diagramas/automata.png}
\caption{Autómata Finito. Reconocedor de Tokens}
\end{center}
\end{figure}


\chapter{Analizador Sintáctico}
\section{Conversión del lenguaje de entrada en EBNF a GLC}
A continuación se muestra la conversión de la descripción en EBNF del lenguaje de entrada realizado en el punto 4.1 a una gramática libre de contexto:
\lstinputlisting[title=GLC]{GLC}
\newpage

\chapter{Análisis semántico}
Una vez que se ha llegado a este punto el lenguaje que se haya proporcionado como entrada ha pasado por dos etapas, en primer lugar se ha llevado a cabo un análisis léxico, analizando las \mbox{palabras} que forman del lenguaje fuente y comprobando su pertenencia al lenguaje definido, además también se realiza la eliminación de espacios en blanco, saltos de línea y
página, tabuladores, etc. En esta etapa también se realiza la detección de algunos de los errores léxico que se puedan cometer.\\
\\En la segunda etapa realiza un análisis sintáctico en el que se analiza la secuencia de tokens procedentes del análisis léxico y se verifica si son correctos sintácticamente, además en esta etapa también se realiza la detección de errores sintácticos.\\
\\Realizadas las dos fases anteriores se llega al análisis semántico cuyo cometido es el de dar significado al lenguaje fuente o lo que es lo mismo, la generación de código, en el caso de esta práctica el código que se obtendrá a la salida variará según las operaciones que se definan en la entrada que se proporciona. La práctica permite la conversión entre gramáticas EBNF y gramáticas libre de contexto, en este caso dada una gramática EBNF o una libre de contexto se generará la definición de una gramática equivalente a la introducida. También esta práctica permite la representación parcial o en su totalidad en una gramática EBNF mediante diagramas de Conway, en este caso en el análisis semántico se generará el código necesario para su representación gráfica en forma de diagrama.\\
Dentro del análisis semántico también se termina de completar el lenguaje fuente, ya que existen restricciones que no son estructurales y no pueden ser representadas mediante una gramática libre de contexto, estas restricciones permitirán por ejemplo que no sea posible utilizar una gramática que no ha sido declarada con anterioridad o que los identificadores de las gramáticas sean únicos.


\chapter{Generación de código}
\section{Atributos}
A continuación se enumeran y explican cada los atributos de cada uno de los símbolos de la gramática que serán empleados para representar la información:

\textbf{ConDiaCClass}
\begin{itemize}
\item El atributo \texttt{ebnfs} está formado por una lista de objetos de la clase \texttt{EBNFClass}, que contiene las grámaticas ebnfs que se han definido, en el caso de que se haya definido alguna.
\item El atributo \texttt{glcs} está formado por una lista de objetos de la clase \texttt{GLCClass}, que contiene las grámaticas libres de contexto que se hayan definido, en el caso de que se haya definido alguna.
\item El atributo \texttt{operations} esta formado por una lista de objetos de la clase \texttt{Operations}, esta lista contiene todas las operaciones que se quieran realizar entre las gramáticas anteriormente definidas, entre las que se encuentran la transformación de GLC a EBNF y viceversa, asi como su representación mediante su Diagrama de Conway.
\end{itemize}

\textbf{EBNFClass}
\begin{itemize}
\item El atributo \texttt{id} representa el identificador de la gramática EBNF.
\item El atributo \texttt{sr} está formada por una lista de objetos de la clase \texttt{SintaxRule}, que contiene el conjunto de reglas sintácticas que definen la gramática EBNF.
\item El atributo \texttt{simbols} está formado por una lista de objetos de la clase \texttt{Simbol} que representa el conjunto de símbolos, tanto terminales como no terminales, que contiene la gramática EBNF.
\end{itemize}

\textbf{SintaxRule}
\begin{itemize}
\item El atributo \texttt{id} representa el símbolo no terminal que se encuentra a la izquierda de la asignación en la regla sintáctica. Este atributo podrá carecer de valor cuando la regla que se esté definiendo sea una regla sintáctica de una gramática EBNF que sea opcional, una repetición o una agrupación.
\item El atributo \texttt{type} sólo es utilizado para reglas sintácticas de gramáticas EBNF y contiene si la regla sintáctica es del tipo \texttt{OPTIONAL}, \texttt{REPEATED} o \texttt{GROUPED}, este atributo puede carecer de valor, lo que indicará que la regla sintáctica no es de ninguno de los tipos definidos antes.
\item El atributo \texttt{position} almacena la posición de un objeto \texttt{SintaxRule} del tipo \texttt{OPTIONAL}, \texttt{REPEATED} o \texttt{GROUPED} dentro de una determinada producción.
\item El atributo \texttt{productions} está formado por una lista de objetos de la clase \texttt{Production}, que contiene la lista de producciones que forman la regla sintáctica.
\end{itemize}

\textbf{Production}
\begin{itemize}
\item El atributo \texttt{simbols} está formado por una lista de objetos de la clase \texttt{Simbol} que contiene los símbolos que forman la producción.
\item El atributo \texttt{srsimbols} está formado por una lista de objetos de la clase \texttt{SintaxRule}, esta lista sólo contendrá elementos cuando la gramática sea EBNF y además la producción contenga alguna repetición, agrupación u opcionalidad.
\end{itemize}

\textbf{GLCClass}
\begin{itemize}
\item El atributo \texttt{id} representa el identificador de la gramática libre de contexto.
\item El atributo \texttt{sr} está formada por una lista de objetos de la clase \texttt{SintaxRule}, que contiene el conjunto de reglas sintácticas que definen la gramática libre de contexto.
\item El atributo \texttt{simbols} está formado por una lista de objetos de la clase \texttt{Simbol} que representa el conjunto de símbolos, tanto terminales como no terminales, que contiene la gramática libre de contexto.
\end{itemize}


\textbf{Simbol}
\begin{itemize}
\item El atributo \texttt{type} representa el tipo del atributo, los únicos tipos permitidos son \texttt{terminal} y \texttt{nonterminal}.
\item El atributo \texttt{value} representa el valor del atributo, es decir, la cadena de texto que lo define.
\end{itemize}

\textbf{Operation}
\begin{itemize}
\item El atributo \texttt{type} representa el tipo de operación a realizar, las únicas operaciones permitidas son \texttt{ebnf2conway}, \texttt{glc2conway}, \texttt{ebnf2glc} y \texttt{glc2ebnf}. La primera y segunda operación toman como entrada una gramática expresada en EBNF y una gramática libre de contexto, respectivamente para generar el diagrama Conway equivalente, las dos últimas operaciones permiten realizar el paso de una gramática EBNF a gramática libre de contexto y viceversa. 

\item El atributo \texttt{id} representa el identificador de la gramática sobre la que se va a efectuar la operación.


\end{itemize}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% FIN DEL DOCUMENTO
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\end{document}

